Google Cloud の Workflows で Batch を呼び出してみた
Google Cloud データエンジニアのはんざわです。
今回のブログでは、Google Cloud の Workflows で Batch を呼び出してみたいと思います。
Batch の概要や特徴などは過去のブログを参照してください。
やりたいこと
今回のブログでやりたいことは以下のとおりです。
- Workflows で Batch のジョブを作成する
- Workflows を手動で呼び出す
- ジョブの構成自体は前回のブログの内容と同じ
イメージとしては、以下のような構成図になります。
また、今回の検証は下記の公式ドキュメントを参考にしています。
併せて、確認してください。
事前準備
一部のリソースは、前回の検証で使用したものを再利用します。
- Batch のジョブを実行するサービスアカウント
- 圧縮されたファイルを保管する Cloud Storage
- 解凍したファイルを保管する Cloud Storage
- Batch にマウントする Cloud Storage
- 実行するスクリプト
1. サービスアカウントの作成
Workflows を実行するサービスアカウントを新たに作成し、以下の3つの権限を付与します。
- バッチジョブ編集者(
roles/batch.jobsEditor
) - サービスアカウントユーザー(
roles/iam.serviceAccountUser
) - ログ書き込み(
roles/logging.logWriter
)
# サービスアカウントを作成
$ gcloud iam service-accounts create sa-workflows
# roles/batch.agentReporter の権限を付与
$ gcloud projects add-iam-policy-binding <PROJECT_ID> \
--member="serviceAccount:sa-workflows@<PROJECT_ID>.iam.gserviceaccount.com" \
--role="roles/batch.jobsEditor" \
--condition None
# roles/iam.serviceAccountUser の権限を付与
$ gcloud projects add-iam-policy-binding <PROJECT_ID> \
--member="serviceAccount:sa-workflows@<PROJECT_ID>.iam.gserviceaccount.com" \
--role="roles/iam.serviceAccountUser" \
--condition None
# roles/logging.logWriter の権限を付与
$ gcloud projects add-iam-policy-binding <PROJECT_ID> \
--member="serviceAccount:sa-workflows@<PROJECT_ID>.iam.gserviceaccount.com" \
--role="roles/logging.logWriter" \
--condition None
2. Workflows の作成
次に Batch のジョブ作成と実行を行う Workflows を作成します。
Workflows の構成は、以下のとおりです。
構成名 | 入力内容 |
---|---|
ワークフロー名 | exec-batch-job |
ワークフローの説明 | 省略 |
リージョン | asia-northeast1(東京) |
サービスアカウント | sa-workflows@<PROJECT_ID>.iam.gserviceaccount.com |
呼び出しログレベル | 指定なし |
暗号化 | Google が管理する暗号鍵 |
環境変数 | 省略 |
ラベル | 省略 |
トリガー | 省略 |
また、ワークフローの定義は以下のとおりです。
main:
steps:
- init:
assign:
- project: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
- location: ${sys.get_env("GOOGLE_CLOUD_LOCATION")}
- createAndRunBatchJob:
call: googleapis.batch.v1.projects.locations.jobs.create
args:
parent: ${"projects/" + project + "/locations/" + location}
body:
taskGroups:
taskSpec:
runnables:
- script:
path: "/scripts/script.sh"
computeResource:
cpuMilli: "500"
memoryMib: "500"
environment:
variables:
FILE_PATH: "test/sample.csv.gz"
INPUT_BUCKET: "hanzawa-yuya-compressed-files"
OUTPUT_BUCKET: "hanzawa-yuya-uncompressed-files"
volumes:
- gcs:
remotePath: "hanzawa-yuya-batch-mount/test"
mountPath: "/scripts"
allocationPolicy:
instances:
- policy:
machineType: "e2-micro"
provisioningModel: "STANDARD"
location:
allowedLocations:
- ${"regions/" + location}
serviceAccount:
email: ${"sa-batch@" + project + ".iam.gserviceaccount.com"}
logsPolicy:
"destination": "CLOUD_LOGGING"
result: createAndRunBatchJobResponse
参考ドキュメント
動かしてみる
早速、作成した Workflows を動かしてみたいと思います。
コンソールから作成した exec-batch-job
-> 実行
を選択し、手動で呼び出します。
Workflows と Batch の実行タイミングを確認します。それぞれ以下のとおりです。
- Workflows
- Batch
さらに表にまとめると次のようになります。
時間 | サービス | ステータス |
---|---|---|
10:44:41 | Workflows | 実行開始 |
10:44:44 | Batch | QUEUED から SCHEDULED に変更 |
10:45:49 | Batch | SCHEDULED から RUNNING に変更 |
10:45:53 | Batch | RUNNING から SUCCEEDED に変更 |
10:46:13 | Workflows | 実行終了 |
この結果からわかるように、Workflows から Batch を呼び出すと同期でレスポンスが返ってきています。(= つまり、Batch の処理が終わってから Workflows が次のステップに進む)
また、解凍処理が正常に完了していることが確認できました。
まとめ
今回のブログでは、Google Cloud の Workflows で Batch を呼び出す方法を紹介しました。
この検証では、手動で Workflows を実行しましたが、もちろん Cloud Scheduler などから変数と一緒に呼び出し、柔軟性が高くすることも可能です。
是非、試してみてください。